package org.execute.tool.adsPower;

import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;

public class TestMain {
    private static final Logger logger = LoggerFactory.getLogger(Main.class);

    public static void main(String[] args) throws InterruptedException {
        // 1. 配置线程池参数
        int corePoolSize = 4; // 核心线程数（常驻线程）
        int maximumPoolSize = 5; // 最大线程数
        long keepAliveTime = 60; // 非核心线程空闲超时时间
        TimeUnit unit = TimeUnit.SECONDS; // 超时时间单位
        String filePath = "E:\\test\\test2.txt";
        String filePath2 = "E:\\test\\test3.txt";
        List<String> randomReply = readFileLines(filePath2);


        BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(120); // 任务队列（容量为2）
        ThreadFactory threadFactory = new CustomThreadFactory(); // 线程工厂（自定义线程名）
        RejectedExecutionHandler handler = new ThreadPoolExecutor.CallerRunsPolicy(); // 拒绝策略
        // 2. 创建线程池（推荐方式）
        ThreadPoolExecutor executor = new ThreadPoolExecutor(
                corePoolSize,
                maximumPoolSize,
                keepAliveTime,
                unit,
                workQueue,
                threadFactory,
                handler
        );

        // 1. 配置批量处理的参数
        String apiKey = "4225429f4d86edf64cb1416482b84fb8"; // 替换为实际API密钥
//        List<String> profileIds = new ArrayList<>();
//        profileIds.add("k150e38p");       // 配置ID1
//        profileIds.add("k150dtjw");   // 配置ID2（替换为实际ID）
        List<String> profileIds = readFileLines(filePath);


        AdspowerStart2 adspowerStart2 = new AdspowerStart2(apiKey, profileIds);

//        Map<String, AdsPowerWebAction> stringAdsPowerWebActionMap = adspowerStart2.openBrowserList();
        // 提交多个任务
        for (String profileId : profileIds) {

            executor.execute(() -> {

                AdsPowerWebAction adsPowerWebAction = null;
                try {
                    adsPowerWebAction = adspowerStart2.openBrowser(profileId);
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }

                String random = getRandomElementFromList(randomReply);


                int number = 3;
                boolean isSuccess = true;
                //关闭全标签
                adsPowerWebAction.closeAllTabs();


                task(adsPowerWebAction);

                // 4. 记录非成功数据：3次循环后仍未成功
                // 记录非成功数据到文件
                if (!isSuccess) {
                    String failureMessage = String.format(
                            "【任务最终失败】profileId: %s, 重试次数: %d次, 使用的回复内容: %s",
                            profileId,
                            number,
                            random
                    );
                    FileLogger.log(failureMessage);
                } else {
                    // 记录成功日志到文件
                    String successMessage = String.format(
                            "【任务成功】profileId: %s, 使用的回复内容: %s",
                            profileId,
                            random
                    );
                    FileLogger.log(successMessage);
                }
                try {
                    adspowerStart2.stopBrowser(profileId);
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            });

        }
        executor.shutdown(); // 关闭线程池，不再接受新任务
        try {
            // 等待所有已提交的任务执行完成（设置超时时间，根据实际任务耗时调整）
            // 这里设置1小时超时，可根据实际情况修改
            if (!executor.awaitTermination(1, TimeUnit.HOURS)) {
                // 如果超时，强制关闭未完成的任务
                executor.shutdownNow();
            }
        } catch (InterruptedException e) {
            // 若等待过程中被中断，强制关闭
            executor.shutdownNow();
        }
        Thread.sleep(2000); // 模拟任务耗时

        adspowerStart2.closeAll();

    }

    static  void task(AdsPowerWebAction webAction) {
    //        写一个操作插件的任务，测试方法
        BasicOperations.openPlugin(webAction,"AdsPower助手");

    }

    // 自定义线程工厂（用于设置线程名，便于调试）
    static class CustomThreadFactory implements ThreadFactory {
        private final AtomicInteger count = new AtomicInteger(1);

        @Override
        public Thread newThread(Runnable r) {
            Thread thread = new Thread(r, "custom-thread-" + count.getAndIncrement());
            thread.setDaemon(false); // 非守护线程
            thread.setPriority(Thread.NORM_PRIORITY); // 正常优先级
            return thread;
        }
    }

    /**
     * 读取文本文件的每一行到List中
     *
     * @param filePath 文件路径
     * @return 包含文件每行内容的List，如果发生错误则返回null
     */
    public static List<String> readFileLines(String filePath) {
        // 创建一个ArrayList来存储文件的每一行
        List<String> lines = new ArrayList<>();

        // 使用try-with-resources语法，确保资源自动关闭
        try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
            String line;
            // 逐行读取文件内容
            while ((line = br.readLine()) != null) {
                // 将读取到的行添加到List中
                lines.add(line);
            }
            return lines;
        } catch (IOException e) {
            // 处理可能出现的IO异常
            System.err.println("读取文件时发生错误：" + e.getMessage());
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 提取USDC相关数据（需提前确保已导航到目标页面）
     *
     * @param webAction AdsPowerWebAction实例
     * @return 提取的USDC数据map，key为"name"，value为数值型数值
     * @throws IllegalArgumentException 当webAction为null时抛出
     * @throws TimeoutException         当元素超时未加载时抛出
     * @throws NoSuchElementException   当元素不存在时抛出
     */
    public static Map<String, Double> extractUSDCData(AdsPowerWebAction webAction) {
        if (webAction == null) {
            throw new IllegalArgumentException("AdsPowerWebAction实例不能为空");
        }

        // 定义元素定位器（与JS中选择器对应）
        By buttonSelector = By.cssSelector(
                "button.rounded-\\[20px\\].py-3\\.5.px-4.flex.gap-4.items-center.justify-start.bg-fill-elevated.w-full"
        );
        String nameCss = "span.block.text-left span.block.text-xs.text-label-secondary";
        String valueCss = "span.block.text-right span.block:first-of-type";


//        webAction.waitForElementPresent(buttonSelector); // 等待textarea可见
        webAction.waitMillis(2000);
        // 等待按钮元素加载并获取列表

        List<WebElement> buttons = webAction.findElements(buttonSelector);

        Map<String, Double> resultMap = new HashMap<>();

        // 遍历按钮查找USD Coin数据
        for (WebElement button : buttons) {
//            System.out.println("button"+ button.getAttribute("outerHTML"));
            WebElement nameSpan = button.findElement(By.cssSelector(nameCss));
            String name = nameSpan.getText().trim();
            if (name.isEmpty()) {
                name = nameSpan.getAttribute("textContent").trim();
            }
//            System.out.println("nameSpan"+ nameSpan.getAttribute("outerHTML"));
            WebElement valueSpan = button.findElement(By.cssSelector(valueCss));
            String valueText = valueSpan.getText().trim();
            if (valueText.isEmpty()) {
                valueText = valueSpan.getAttribute("textContent").trim();
            }
//            System.out.println("valueSpan"+ valueSpan.getAttribute("outerHTML"));
            // 处理数值格式（移除非数字和小数点字符）
            String numericValueStr = valueText.replaceAll("[^0-9.]", "");
            if (!numericValueStr.isEmpty()) {
                Double numericValue = Double.parseDouble(numericValueStr);
                resultMap.put(name, numericValue);
            }

        }

        return resultMap; // 找到后立即返回
    }

    public static <T> T getRandomElementFromList(List<T> list) {
        // 先判断 List 是否为空，避免空指针或索引越界
        if (list == null || list.isEmpty()) {
            System.out.println("List 为空，无法获取随机元素");
            return null; // 或抛异常，根据业务需求调整
        }

        // 创建 Random 实例，生成 0 ~ list.size()-1 的随机索引
        Random random = new Random();
        int randomIndex = random.nextInt(list.size()); // nextInt(n) 生成 [0, n) 的整数

        // 根据随机索引返回元素
        return list.get(randomIndex);
    }
}
